import java.util.*;
import java.util.concurrent.DelayQueue;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: 言初
 * Date: 2023-02-02
 * Time: 17:04
 */
public class Main {
    public static void main(String[] args) {

    }




    public static void main18(String[] args) {
        int[] array = {1,3,5,7,9};
        printArray(array,array.length);
    }
    public static void printArray(int[] array,int len){
        //递归实现数组的逆序打印。
        if(len==0){
            return;
        }
        System.out.println(array[len-1]);
        printArray(array,len-1);
    }





    public static void main17(String[] args) {
        String str="bit666keji123";
        System.out.println(isNumeric(str));//6
    }
    public static int isNumeric(String str){
        //输入一行字符，统计字符串中数字个数。
        //"bit666keji123" 数字的个数为：6个
        int count=0;
        for(int i=0;i<str.length();i++){
            char ch=str.charAt(i);
            if(ch>='0'&&ch<='9'){
                count++;
            }
        }
        return count;
    }





    public static void main16(String[] args) {
        String str="aabbccdaa";
        System.out.println(str);
        System.out.println(test4(str));// a2b2c2d1a2
    }
    public static String test4(String str){
        //将用户输入的字符串转化（压缩）。
        //"aabbccdaa" -> "a2b2c2d1a2" 或者 例如： "abbccffr" -> "a1b2c3f2r1"
        String ret="";
        int count=1;
        for(int i=0;i<str.length();i++){
            if(i!=str.length()-1 && str.charAt(i)==str.charAt(i+1)){
                count++;
            }else{
                ret=ret+""+str.charAt(i)+count;
                count=1;
            }
        }
        return ret;
    }





    public static void main15(String[] args) {
        String str="I am a student";
        System.out.println(str);  //I am a student
        System.out.println(reverseSentence(str));  //student a am I
    }
    public static String reverseSentence(String str){
        //字符串的逆置,如：“I am a student" 逆置为：”student a am I“
        //把字符串变成了一个字符串数组
        //整体逆置，然后再逆置空格之间的字符串
        char[] ch=str.toCharArray();
        func(ch,0,ch.length-1);
        //System.out.println(ch);
        int j=0;
        for(int i=0;i<ch.length;i++){
            if(ch[i]==' '){
                func(ch,j,i-1);
                j=i+1;
            }
        }
        return String.copyValueOf(ch);
    }
    public static void func(char[] ch,int left,int right){
        while(left<right){
            char c=ch[left];
            ch[left]=ch[right];
            ch[right]=c;
            left++;
            right--;
        }
    }




    public static void main14(String[] args) {
        String str="abcdef";
        String str1=LeftRotateString(str,2);
        System.out.println(str1);
    }
    public static String LeftRotateString(String str,int n){
        //将一个字符串从左开始前k个字符进行旋转：左旋数组 。
        // 例如字符串："abcdef"，前2个左旋结果是："cdefab"。
        //先逆置左边的k个字符，然后逆置右边剩下的字符，然后逆置整体的字符串
        n=n%str.length();
        String str1=func(str,0,n-1);
        //System.out.println(str1);
        String str2=func(str,n,str.length()-1);
        //System.out.println(str2);
        str1=str1+str2;
        String str3=func(str1,0,str.length()-1);
        //System.out.println(str3);
        return str3;
    }
    public static String func(String str,int left,int right){
        String ret="";
        while(left<=right){
            char ch2=str.charAt(right);
            ret=ret+""+ch2;
            right--;
        }
        return ret;
    }




    public static void main13(String[] args) {
        int[][] array = { {1,2,8,9},
                          {2,4,9,12},
                          {4,7,10,13},
                          {6,8,11,15} };
        boolean bool=find_val(array,3,3,10);
        System.out.println(bool);//true
    }
    public static boolean find_val(int [][]arr,int row,int col,int num){
        //                               cols指的是列，rows指的是行。
        //在一个二维数组中，每一行都按照从左到右递增的顺序排序，每一列都按照从上到下递增的顺序排序。请完成
        //一个函数，输入这样的一个二维数组和一个整数，判断数组中是否含有该整数。时间复杂度小于O(n) ,空间复杂度O(1).
        //每一行都是有序的，每一列都是有序的，所以应该用到二分查找
        for(int i=0;i<=row;i++){
            int left=0;
            int right=col;
            while(left<=right){
                int mid=(right+left)/2;
                if(arr[i][mid]<num){
                    left=mid+1;
                }else if(arr[i][mid]>num){
                    right=mid-1;
                }else if(arr[i][mid]==num){
                    return true;
                }
            }
        }
        return false;
    }




    public static void main12(String[] args) {
        int[] arr={1,2,3,4,3,1};
        int[] array=findNumberAppearOnce(arr);
        for(int i=0;i<array.length;i++){
            System.out.println(array[i]);
        }
    }
    public static int[] findNumberAppearOnce(int[] arr){
        //一个整型数组里除了两个数字之外，其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
        //哈希思想
        HashMap<Integer,Integer> map=new HashMap<>();
        for(int i=0;i<arr.length;i++){
            if(map.containsKey(arr[i])){
                map.put(arr[i],map.get(arr[i])+1);
            }else{
                map.put(arr[i],1);
            }
        }
        int[] array=new int[2];
        int j=0;
        for(int i=0;i<arr.length;i++){
            if(map.get(arr[i])==1){
                array[j]=arr[i];
                j++;
            }
        }
        return array;
    }




    public static void main11(String[] args) {
        System.out.println(isPower(100));//false
        System.out.println(isPower(64));//true
    }
    public static boolean isPower(int n){
        //如何判断一个数是否是2的k次方？这里不需要确定k的值。例如：1是2的0次方，2是2的1次方，4是2的平方，
        //求N是不是2的K次方？
        int i=0;
        int ret=(int)Math.pow(2,i);
        while(ret<n){
            i++;
            ret=(int)Math.pow(2,i);
        }
        // ret==n 或者 ret>n 了
        if(ret==n){
            return true;
        }
        return false;
    }



    public static void main10(String[] args) {
        int[] array={1,2,4,8,5,7}; // 27
        System.out.println(arraySum(array,array.length));
    }
    //编写一个递归程序，求一个一维数组的所有元素的和？
    private static int num;
    public static int arraySum(int[] array,int len){
        //递归程序
        if(len==0){
            return 0;
        }
        arraySum(array,len-1);
        num+=array[len-1];
        return num;
    }



    public static void main9(String[] args) {
        //一对相亲数是指：甲的约数之和等于乙，乙的约数之和等于甲。求1000以内的相亲数。
        for(int i=1;i<=1000;i++){
            for(int j=i+1;j<=1000;j++){
                if(func(i)==j && func(j)==i){
                    System.out.println(i+"和"+j+"是相亲数");//220和284是相亲数
                }
            }
        }
    }
    public static int func(int n){
        //求一个数的约数之和
        int count=0;
        for(int i=1;i<=n/2;i++){
            if(n%i==0){
                count+=i;
            }
        }
        return count;
    }




    public static void main8(String[] args) {
        //给定一个3乘以3的二维数组，里面的数据随机生成。分别求出两个对角线的元素之和。
        //生成随机数
        Random random=new Random();
        //int num= random.nextInt();
        int[][] array=new int[3][3];
        for(int i=0;i<3;i++){
            for(int j=0;j<3;j++){
                array[i][j]= random.nextInt(100);
                System.out.print(array[i][j]+" ");
            }
        }
        System.out.println();
        int count=0;
        int count2=0;
        for(int i=0;i<3;i++){
            for(int j=0;j<3;j++){
                if(i==j){
                    count+=array[i][j];
                }
                if(i+j==2){
                    count2+=array[i][j];
                }
            }
        }

        System.out.println(count);
        System.out.println(count2);
    }





    public static void main7(String[] args) {
        System.out.println(getAge(5));//18
    }
    //有5个人坐在一起，问第五个人多少岁？他说比第4个人大2岁。问第4个人岁数，他说比第3个人大2岁。问第三
    //个人，又说比第2人大两岁。问第2个人，说比第一个人大两岁。最后问第一个人，他说是10岁。请问第五个人多大？
    public static int getAge(int age){
        int n=10;
        for(int i=2;i<=age;i++){
            n+=2;
        }
        return n;
    }




    public static void main6(String[] args) {
        System.out.println(fun(7));//输出了 13
    }

    public static int fun(int n){
        //有一对兔子，从出生后第3个月起每个月都生一对兔子，小兔子长到第三个月后每个月又生一对兔子，假如兔子
        //都不死，问第n个月的兔子对数为多少？
        //斐波那契数列
        if(n==1||n==2){
            return 1;
        }
        int count=0;
        int a1=1;
        int a2=1;
        for(int i=3;i<=n;i++){
            count=a1+a2;
            a1=a2;
            a2=count;
        }
        return count;
    }



    public static void main5(String[] args) {
        //一球从100米高度自由落下，每次落地后反跳回原高度的一半；再落下，求它在 第10次落地时，共经过多少米？第10次反弹多高？
        //2个地方，一个是第10次落地时的总路程，一个是第10次反弹了多高
        double high=100;
        double s10=0;
        for(int i=0;i<10;i++){
            if(high==100){
                s10+=high;
            }else {
                s10 += 2 * high;
            }
            high/=2;
        }
        System.out.println("总路程为："+s10+"米"+"    第10次弹起高度是："+high+"米");
        //                  总路程为：299.609375米    第10次弹起高度是：0.09765625米
    }




    public static void main4(String[] args) {
        //猴子吃桃问题。猴子第一天摘下若干个桃子，当时就吃了一半，还不过瘾，就又吃了一个。第二天又将剩下的
        //桃子吃掉一半，又多吃了一个。以后每天都吃前一天剩下的一半零一个。到第 10 天在想吃的时候就剩一个桃子了,
        //求第一天共摘下来多少个桃子？
        int n=1;//假设一共n个桃子
        int day=10;
        for(int i=day-1;i>0;i--){
            n=(n+1)*2;
        }
        System.out.println(n);//1534
    }






    public static void main3(String[] args) {
        //编程求 1~10000 之间的所有“完全数”，----> 6 28 496 8128
        for(int i=1;i<=10000;i++){
            if(perfectNumber(i)){
                System.out.print(i+" ");
            }
        }
    }

    public static boolean perfectNumber(int num ) {
        //完全数是该数的所有因子之和等于该数的数。例如，6 的因子有 1、2、
        //3，且 6=1+2+3，所以 6 是完全数。
        //判断是否是完全数
        List<Integer> list=new ArrayList<>();
        //一个数的因子
        for(int i=1;i<=num/2;i++){
            if(num%i==0){
                list.add(i);
            }
        }
        int count=0;
        for(int i=0;i<list.size();i++){
            count+=list.get(i);
        }
        if(count==num){
            return true;
        }
        return false;
    }




    public static void main2(String[] args) {
        isDays(2022,3,23);
    }

        //2022年1月15日，是该年的第15天
    public static void isDays(int year,int month,int day) {
        //对输入的年、月、日，给出该天是该年的第多少天？
        //假设每个月都是30天吧
        int count=(month-1)*30+day;
        System.out.println(count);
    }


    public static void main1(String[] args) {
        //输入一个字符，判断它是否为小写字母，如果是，将它转换成大写字母，否则，不转换。
        Scanner sc=new Scanner(System.in);
        char ch=sc.next().charAt(0);
        if(ch>='a'&&ch<='z'){
            //把小写的字母转化成大写的字母
            ch=(char)(ch-32);
        }
        System.out.println(ch);
    }
}
